import socket

import requests
from requests.exceptions import ProxyError

from service import LogRecoderService, ConfigService

# -*- coding:utf-8 -*-
"""
作用：1.判断当前环境有无网络 2.判断Java服务网络心跳 3.判断教务官网网络是否畅通
作者：MySoul
日期：2023年07月19日
"""


def check_internet_connection(url):
    """
    判断网络状态
    :return: 有网，无网
    """
    try:
        # 创建一个套接字连接到一个外部的IP地址（这里选择了百度的IP）
        socket.create_connection((url, 80))
        return True
    except OSError:
        pass
    return False


def check_internet_status_by_requests(url):
    """
    判断响应返回码状态
    :return:
    """
    try:
        resp = requests.get(url)
        status = resp.status_code
        if status != 200:
            return False
        else:
            return True
    except ProxyError:
        return False
    except Exception as e:
        return False


def keepLive(config_service):
    """
    1.判断当前环境有无网络 2.判断Java服务网络心跳 3.判断教务官网网络是否畅通
    :return: Boolean值
    """
    LogRecoderService.logger.info("测试网络中~")
    # 循环判断三次
    networkErrorCount = 3
    serviceErrorCount = 0
    while networkErrorCount:
        networkErrorCount -= 1
        # 1.判断有无网络
        hasOnline = check_internet_connection("www.baidu.com")
        if not hasOnline:
            # 无网，直接跳过
            continue

        # 2.判断心跳服务网络
        # 2.1读取配置中的服务器信息
        root_url = ConfigService.get_config(config_service, "server", "root_url")  # 获取服务器根路径
        message = ConfigService.get_config(config_service, "server", "message")  # 获取message路径
        # 2.2检测网络是否正常
        hasOnline = check_internet_status_by_requests(
            root_url + message)
        if not hasOnline:
            # 无网，则记录
            if serviceErrorCount:
                LogRecoderService.logger.warning("Java服务连接异常，请注意检查！")
            serviceErrorCount += 1
            continue

        # 3.判断教务官网网络
        hasOnline = check_internet_status_by_requests(
            "https://sso.scetc.edu.cn/login?service=https:%2F%2Fjiaowu.scetc.edu.cn%2Fsso.jsp")
        if not hasOnline:
            # 无网，直接跳过
            continue
        LogRecoderService.logger.info("网络测试通过~")
        return True
    LogRecoderService.logger.warning("网络测试未通过，此刻本机无网或服务宕机，请检查当前网络环境！！")
    return False


if __name__ == '__main__':
    ok = keepLive("")
    print(ok)
